package com.hanserwei.community.entity.common;

import com.hanserwei.community.enums.ResponseCodeEnum;

/**
 * 统一API响应类 (Unified API Response)
 *
 * @param code    响应状态码, 对应 ResponseCodeEnum 中的 code
 * @param message 响应提示信息
 * @param data    响应数据
 * @param <T>     响应数据的泛型
 */
public record ApiResponse<T>(int code, String message, T data) {

    // ========== 成功响应的静态工厂方法 ==========

    /**
     * 成功响应（无数据）
     *
     * @return ApiResponse
     */
    public static ApiResponse<Void> success() {
        return new ApiResponse<>(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMessage(), null);
    }

    /**
     * 成功响应（有数据）
     *
     * @param data 响应数据
     * @param <T>  数据类型
     * @return ApiResponse
     */
    public static <T> ApiResponse<T> success(T data) {
        return new ApiResponse<>(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMessage(), data);
    }

    /**
     * 成功响应（自定义消息和数据）
     *
     * @param message 自定义成功消息
     * @param data    响应数据
     * @param <T>     数据类型
     * @return ApiResponse
     */
    public static <T> ApiResponse<T> success(String message, T data) {
        return new ApiResponse<>(ResponseCodeEnum.SUCCESS.getCode(), message, data);
    }


    // ========== 失败响应的静态工厂方法 ==========

    /**
     * 失败响应（使用枚举）
     *
     * @param codeEnum 响应码枚举
     * @return ApiResponse
     */
    public static ApiResponse<Void> error(ResponseCodeEnum codeEnum) {
        return new ApiResponse<>(codeEnum.getCode(), codeEnum.getMessage(), null);
    }

    /**
     * 失败响应（使用枚举和自定义消息）
     * <p>
     * 使用场景：当通用的枚举信息不够具体时，例如 "参数错误"，可以补充为 "参数[username]不能为空"
     *
     * @param codeEnum 响应码枚举
     * @param message  自定义覆盖信息
     * @return ApiResponse
     */
    public static ApiResponse<Void> error(ResponseCodeEnum codeEnum, String message) {
        return new ApiResponse<>(codeEnum.getCode(), message, null);
    }

    /**
     * 失败响应（完全自定义状态码和消息）
     *
     * @param code    自定义状态码
     * @param message 自定义消息
     * @return ApiResponse
     */
    public static ApiResponse<Void> error(int code, String message) {
        return new ApiResponse<>(code, message, null);
    }
}